
通过 javac 可以创建注解处理器，并将注解应用于 Java 源文件，而不是编译后的类文件。不过这里有个限制，就是无法通过注解处理器来修改源代码。唯一能影响结果的方法是创建新的文件。

如果注解处理器创建了一个新的源文件，则在新一轮的处理中会检查该文件自身的注解。该工具会一轮接着一轮地持续处理，直到不再有新的源文件被创建，然后就编译所有的源文件。

自己编写的每个注解都应该有对用的处理器，javac 可以轻松地将 若干注解处理器进行组合。你可以指定多个要处理的类，并且还可以添加监听器来接受一轮处理完成的通知。

## 最简单的处理器

先定义一个注解：

```java
package annotations.simplest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD,
    ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE,
    ElementType.LOCAL_VARIABLE})
public @interface Simple {
  String value() default "-default-";
}

```



@Retention 现在变成了 SOURCE, 这意味着该注解不会存活到编译后的代码中。 javac 是唯一有机会处理注解的代理。

以下是用来测试的代码

```java
package annotations.simplest;

@Simple
public class SimpleTest {
  @Simple
  int i;
  @Simple
  public SimpleTest() {

  }

  @Simple
  public void foo() {
    System.out.println( "foo" );
  }
  @Simple
  public void bar (String s,int i, float f) {
    System.out.println(" bar ");
  }
  @Simple
  public static void main(String[] args) {
    @Simple
    SimpleTest t = new SimpleTest();
    t.foo();
  }
}

```

此处用 @Simple 注解了所有 @Target 声明所允许的内容。

SimpleTest.java 只要求 Simple.java 能成功编译，虽然编译的过程中什么都没有发生。java 允许使用 @Simple 注解，但是不会对它做任何事情，直到我们创建了一个注解处理器，并将其绑定到编译器中。

